home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Genie / Projects / Siesta / Source / Sources / SiesString.cc
Encoding:
C/C++ Source or Header  |  2000-06-24  |  3.4 KB  |  203 lines

  1. /*    =============
  2.  *    SiesString.cc
  3.  *    =============
  4.  */
  5.  
  6. #include <string.h>
  7.  
  8. #include <Memory.h>
  9.  
  10. #include "DGHandleLocker.hh"
  11.  
  12. #include "SiesString.hh"
  13.  
  14. SiesString::SiesString()
  15. : mPtr(NULL), mLen(-1)
  16. {
  17.     
  18. }
  19.  
  20. SiesString::SiesString(const SiesString &inString)
  21. : mPtr(NULL), mLen(-1)
  22. {
  23.     Set(inString);
  24. }
  25.  
  26. SiesString::SiesString(void *inData, long inLen)
  27. : mPtr(NULL), mLen(-1)
  28. {
  29.     Set(inData, inLen);
  30. }
  31.  
  32. SiesString::SiesString(const char *inCStr)
  33. : mPtr(NULL), mLen(-1)
  34. {
  35.     Set(inCStr);
  36. }
  37.  
  38. SiesString::SiesString(const unsigned char *inPStr)
  39. : mPtr(NULL), mLen(-1)
  40. {
  41.     Set(inPStr);
  42. }
  43.  
  44. SiesString::SiesString(Handle inHandle)
  45. : mPtr(NULL), mLen(-1)
  46. {
  47.     Set(inHandle);
  48. }
  49.  
  50. SiesString::~SiesString()
  51. {
  52.     delete [] mPtr;  // checks for NULL
  53. }
  54.  
  55.  
  56. void
  57. SiesString::Set(const void *inData, long inLen)
  58. {
  59.     Realloc(inLen);
  60.     memcpy(mPtr, inData, inLen);
  61. }
  62.  
  63. void
  64. SiesString::Set(const SiesString &inString)
  65. {
  66.     Set(inString.Ptr(), inString.Length());
  67. }
  68.  
  69. void
  70. SiesString::Set(const char *inCStr)
  71. {
  72.     Set((void *)inCStr, strlen(inCStr));
  73. }
  74.  
  75. void
  76. SiesString::Set(const unsigned char *inPStr)
  77. {
  78.     Set(inPStr + 1, inPStr[0]);  // inPStr[0] can be 255, but never -1
  79. }
  80.  
  81. void
  82. SiesString::Set(Handle inHandle)
  83. {
  84.     if (!inHandle) return;
  85.     if (!*inHandle) {
  86.         // Empty handle (NULL master pointer), probably was purged.
  87.         // Should throw appropriate error.
  88.         return;
  89.     }
  90.     Size size = GetHandleSize(inHandle);
  91.     if (size == 0) return;
  92.     
  93.     DGHandleLocker lock(inHandle);
  94.     Set(*inHandle, size);
  95. }
  96.  
  97.  
  98. void
  99. SiesString::Append(const void *inData, long inLen)
  100. {
  101.     long oldLen = mLen;
  102.     Realloc(oldLen + inLen);
  103.     memcpy((char *)mPtr + oldLen, inData, inLen);
  104. }
  105.  
  106. void
  107. SiesString::Append(const SiesString &inString)
  108. {
  109.     Append(inString.Ptr(), inString.Length());
  110. }
  111.  
  112. void
  113. SiesString::Append(const char *inCStr)
  114. {
  115.     Append((void *)inCStr, strlen(inCStr));
  116. }
  117.  
  118. void
  119. SiesString::Append(const unsigned char *inPStr)
  120. {
  121.     Append(inPStr + 1, inPStr[0]);  // inPStr[0] can be 255, but never -1
  122. }
  123.  
  124. void
  125. SiesString::Append(Handle inHandle)
  126. {
  127.     if (!inHandle) return;
  128.     if (!*inHandle) {
  129.         // Empty handle (NULL master pointer), probably was purged.
  130.         // Should throw appropriate error.
  131.         return;
  132.     }
  133.     Size size = GetHandleSize(inHandle);
  134.     if (size == 0) return;
  135.     
  136.     DGHandleLocker lock(inHandle);
  137.     Append(*inHandle, size);
  138. }
  139.  
  140.  
  141. long
  142. SiesString::Length() const
  143. {
  144.     return (mLen < 0) ? 0 : mLen;
  145. }
  146.  
  147. void *
  148. SiesString::Ptr() const
  149. {
  150.     return mPtr;
  151. }
  152.  
  153. long
  154. SiesString::GetData(void *outData, long inLen) const
  155. {
  156.     long len = (mLen < inLen) ? mLen : inLen;
  157.     
  158.     memcpy(outData, mPtr, len);
  159.     return len;
  160. }
  161.  
  162. char *
  163. SiesString::GetCStr(char *outCStr, long inLen) const
  164. {
  165.     long len = (mLen < inLen) ? mLen : inLen;
  166.     outCStr[len] = '\0';
  167.     
  168.     // Note:  a null byte will truncate the string.
  169.     return strncpy(outCStr, (char *)mPtr, len);  // outCStr must be >= inLen + 1 bytes
  170. }
  171.  
  172. unsigned char *
  173. SiesString::GetPStr(unsigned char *outPStr, short inLen) const
  174. {
  175.     long len = (mLen < inLen) ? mLen : inLen;
  176.     if (len > 255) len = 255;
  177.     
  178.     outPStr[0] = len;
  179.     return (unsigned char *)memcpy((char *)outPStr + 1, (char *)mPtr, len);
  180. }
  181.  
  182.  
  183. void
  184. SiesString::Realloc(long inSize)
  185. {
  186.     if (mLen == inSize) return;
  187.     void *oldPtr = mPtr;
  188.     long oldLen = mLen;
  189.     mLen = inSize;
  190.     if (inSize == -1) {
  191.         mPtr = NULL;
  192.         delete [] oldPtr;  // checks for NULL
  193.         return;
  194.     }
  195.     mPtr = new char [inSize];
  196.     // Does new throw exceptions?  Let's hope so...
  197.     if (oldLen > mLen) {
  198.         oldLen = mLen;
  199.     }
  200.     memcpy(mPtr, oldPtr, oldLen);
  201.     delete [] oldPtr;  // checks for NULL
  202. }
  203.